事情來自某天我在找資料的過程中,看到有些大大提供了事件紀錄檔的文本說明,所以今天要來試著閱讀.evtx文件,用文字編輯器打開,挑戰以16進位的格式去閱讀,這在一些取證的技術上常常使用,因為網路的攻擊者在攻擊電腦後可能想要隱藏某些資訊就會去改寫日誌檔,至於到底能改寫多少我們又能復原多少,就要來自我們對日誌檔的理解,雖然為了避免這種狀況最好的方式是設定自動備份日誌檔到某個攻擊者不容易察覺的位置,不過總而言之,都看到這了你應該會對這個題目有興趣吧,所以我還是往下繼續講~
首先,為了避免動到真的日誌檔,筆者習慣會去複製一份到其他位置再開始玩,這裡選擇複製%SystemRoot%\System32\Winevt\Logs
的Setup.evtx,這是Windows更新的日誌檔,檔案不大,我用Sublime Text的HexViewer插件去閱讀這個16進位格式的文件,開頭大致上長這樣:
因為以前打開看到這種純數字編碼就關掉當作看不懂,頂多在登錄檔有看懂一點點(可以參考第9天第三點更改登入畫面的歡迎),所以從昨天就特別下功夫研究了一會,先不說剛開始找插件還不會用的過程,第一次認真看16進位文件有點畏懼。
這個格式稱作Windows XML Event Log (EVTX),從Windows Vista 開始就用它取代Windows Event Log (EVT)格式了,他主要包括文件標頭(file header)、資料塊(chunks)、尾隨空值(trailing empty values) 三個部分。
file header的部分是是指文件開頭固定為4096 byte(4kb)的片段,第一段為簽名固定是45 6C 66 46 69 6C 65 00(ElfFile),是Executable and Linkable Format file的意思,格式可以對照參考資料第二點:
舉例來說,剛剛的簽名就是從第0個byte開始往後佔用8個byte,然後我們再看到00000018行(這是16進位,就是第24個byte後),文件中提到這是指下一個記錄標示,一開始一直看不懂這是什麼意思,然後他寫佔用8個byte,那6100000000000000換過來應該是6989586621679010682,我不懂哪個指標要用到這麼大,但是如果說是61直接換過來就是97~
等等,好像有點眼熟在哪看過,我們回到事件檢視器一瞄,這個文件有96筆記錄,所以如果說這格欄位是表示現在存了96筆記錄,下一筆存進來是第97比這回事好像挺合理的(?
但我怎麼知道61後面的00不用算進去?除非把每個byte倒過來讀,於是找到一個以前明明看過卻不斷被我忽略的東西--大端(Big-Endian)小端(Little-Endian)。
大端:
低記憶體位址 --------------------> 高記憶體位址
高序位的字節 <-------------------- 低序位的字節
小端:
高記憶體位址 --------------------> 低記憶體位址
低序位的字節 <-------------------- 高序位的字節
總之,我們原本預期的6100000000000000的讀法被叫做大端,在CPU讀取效率比較低因為高低相反,而把每個byte倒過來讀就叫小端,這裡就是讀0000000000000061,人類可讀性較差,但對CUP讀取比較迅速,兩者各有優缺,命名由來請見冷知識,而我們的.evtx檔就是Little-Endian的形式!
明明前面在登錄檔介紹也有出現這個字,只能說東西要真的用到才知道他的重要性,在這之前看到什麼學什麼吧~
於是我們往後看著對照,第32 byte後的80 00讀做128是header大小,次要版本是2,主要版本是3,00 10讀作4096指定file header了大小,緊接著的0100是指這份紀錄檔有1個資料塊(chunk)。
在124 byte之後的4個byte是前120 byte的CRC-32校驗值。
到這裡file header的內容就差不多結束了,接下來我們轉到4096 byte之後,是一個chunk,他有69,632個byte,chunk有個512 byte的chunk header,開頭一樣是一個固定的簽名叫45 6C 66 43 68 6E 6B 00(ElfChnk),簽名後會接第一個事件記錄的編號和最後一個紀錄是件的編號,各佔8個byte,在這個範例第一個事件的紀錄就是1號(0100000000000000),最後一筆紀錄就是96號(6000000000000000),第40個byte之後的80000000一樣代表header有128個byte大。
這個chunk有點像是紀錄的容器,不足一個chunk就會以一個chunk作紀錄,這應該也是為什麼你去翻.evtx的時候會看到最小的大小都固定是68kb的原因。
在chunk header後面接著的就是一筆筆的紀錄資料,所以4096+512=4608個byte=1200(16進位),我們找到1200 byte位置會看到一個2a2a0000的字串,這是每一筆紀錄的開頭簽名字串,有幾筆紀錄就會有幾個2a2a0000,下面是這些事件紀錄的規範:
以這份文件來看,1200位置的確出現2a2a0000,後面f0080000表示這筆紀錄含簽名有2288個byte大,接著0100 0000 0000 0000表示這是日誌的第1筆紀錄,再來b902 4b40 5e21 d701是FileTime表示事件寫入的時間,接著就是二進位制的XML紀錄內容。
最後4個byte會再寫一次紀錄的大小,這裡就是第一筆紀錄的開始的4608加他的長度2288減4,我們會在6892 byte,也就是1AEC的地方看到f0080000再出現一次,接著繼續2a2a0000表示下一筆紀錄,最後一筆紀錄也是用其記錄大小作結尾,後面就會有尾隨空值(trailing empty values),一直持續00補到文件大小。
好的,今天我們嘗試閱讀16進位的文件,知道.evtx文件的格式,大概會有時間跟Hash值,還會記錄每個區塊的大小等等,下一篇…筆者考慮看看要不要寫裡面的XML文件怎麼看,感覺這又有點挑戰性了哈哈,放心,我總會生出東西來研究的!
參考資料:
https://superuser.com/questions/1205975/can-sublime-text-be-used-as-hex-editor
https://github.com/libyal/libevtx/blob/main/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc
https://zhuanlan.zhihu.com/p/144718837
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/444383/
https://www.convertworld.com/zh-hant/numerals/hexadecimal.html